﻿#include <iostream>
#include <winsock2.h>  // 提供Windows平台下网络通信的核心API（替代Linux的<arpa/inet.h>和<sys/socket.h>）
#include <ws2tcpip.h>  // 提供TCP/IP协议的附加功能，包含inet_pton/ntop等高级函数
#pragma comment(lib, "ws2_32.lib") // 链接Winsock库(上面两个头文件函数里面的实现)
using namespace std;

int main2() {
	// 演示大小端转换函数----------------------------------------------------------

	// 小端转大端（网络字节序）
	int a = 0x12345678;      // 主机序（小端）整型
	short b = 0x1234;        // 主机序（小端）短整型

	// host to network long/short
	int c = htonl(a);        // 转换为网络字节序（大端）
	short d = htons(b);      // 转换为网络字节序（大端）

	printf("%#x\n", c);      // 0x78563412（小端->大端转换结果）
	printf("%#x\n", d);      // 0x3412

	// 大端转小端（主机字节序）
	printf("%#x\n", ntohl(c)); // 0x12345678（大端->小端转换结果）
	printf("%#x\n", ntohs(d)); // 0x1234

	// 演示IP地址转换（字符串↔整型）---------------------------------------------

	const char* ipStr = "192.168.3.103"; // 字符串形式的IP地址
	unsigned int ipInt;                   // 用于存储整型IP

	// Windows下需要使用in_addr结构（Linux可直接用unsigned int）
	in_addr addr;                        // Windows专用IP地址结构体

	// 使用inet_pton（支持IPv4/IPv6）
	// int inet_pton(int family, const char *strptr, void *addrptr);
	// 参数：AF_INET表示IPv4地址族，ipStr为输入字符串，addr为输出结构
	inet_pton(AF_INET, ipStr, &addr);     // 字符串转二进制IP
	ipInt = addr.s_addr;             // 从结构中提取32位整型值

	printf("%u\n", ipInt);                // 3232235787（整型表示）

	// 整型数据转字符串IP（使用inet_ntop）
	char ipStr2[16];  // 存储转换结果的缓冲区(IPv4需要16个字节)

	// const char *inet_ntop(int family, const void *addrptr, char *strptr, socklen_t len);
	inet_ntop(AF_INET, &addr, ipStr2, sizeof(ipStr2)); // 二进制IP转字符串

	printf("%s\n", ipStr2); // 输出：192.168.3.103

	/*
	inet_addr()和inet_ntoa()方法已经被微软弃用
	*/
	return 0;
}